#ifndef JSON_HANDLER_H
#define JSON_HANDLER_H

#include <string>
#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
#include "../modbus/modbus_master.h"
#include "../config/config.h"
namespace equip_system
{

// 抽象基类
template <typename T>
class JsonHandler
{
public:
    virtual ~JsonHandler() = default;

    /*
        T --> JSON_string
     */
    virtual std::string serialize(const T &data, vector<std::string> &param) = 0;
    /*
        JSON_File --> T
        JSON_File --> JSON_string
     */
    virtual bool read(const std::string &filename, T &data, string &json_string) = 0;
    /*
        T --> JSON_File
     */
    virtual bool write(const std::string &filename, const T &data) = 0;

    std::string _getStringValue(const rapidjson::Value &obj, const char *key, const std::string &defaultValue)
    {
        if (obj.HasMember(key) && obj[key].IsString())
        {
            return obj[key].GetString();
        }
        return defaultValue;
    }

    // 辅助函数：获取整数值，带默认值
    int _getIntValue(const rapidjson::Value &obj, const char *key, int defaultValue)
    {
        if (obj.HasMember(key) && obj[key].IsInt())
        {
            return obj[key].GetInt();
        }
        return defaultValue;
    }
};

// MqttConfig 处理器
class CMqttConfig : public JsonHandler<MqttConfig>
{
public:
    /*
        NodeData --> JSON_string
     */
    std::string serialize(const MqttConfig &data, vector<std::string> &param) override;
    /*
        JSON_File --> NodeData
        JSON_File --> JSON_string
     */
    bool read(const std::string &filename, MqttConfig &data, string &json_string) override;
    /*
        NodeData --> JSON_File
     */
    bool write(const std::string &filename, const MqttConfig &data) override;

private:
    // NodeData fromJson(const rapidjson::Document& doc);
    // rapidjson::Document toJson(const NodeData& data);
    //  MqttConfig mqttConfig;
    //ModbusConfig modbusConfig;

    // // 辅助函数：获取字符串值，带默认值
    // std::string _getStringValue(const rapidjson::Value &obj, const char *key, const std::string &defaultValue);

    // // 辅助函数：获取整数值，带默认值
    // int _getIntValue(const rapidjson::Value &obj, const char *key, int defaultValue);
};

// modbusconfig.json 处理器
class CModbusCofing : public JsonHandler<ModbusConfig>
{
public:
    /*
        NodeData --> JSON_string
     */
    std::string serialize(const ModbusConfig &data, vector<std::string> &param) override;
    /*
        JSON_File --> NodeData
        JSON_File --> JSON_string
     */
    bool read(const std::string &filename, ModbusConfig &data, string &json_string) override;
    /*
        NodeData --> JSON_File
     */
    bool write(const std::string &filename, const ModbusConfig &data) override;

private:
    // NodeData fromJson(const rapidjson::Document& doc);
    // rapidjson::Document toJson(const NodeData& data);
    // MqttConfig mqttConfig;
    // ModbusConfig modbusConfig;

    // // 辅助函数：获取字符串值，带默认值
    // std::string _getStringValue(const rapidjson::Value &obj, const char *key, const std::string &defaultValue);

    // // 辅助函数：获取整数值，带默认值
    // int _getIntValue(const rapidjson::Value &obj, const char *key, int defaultValue);
};
// modbusdataconfig.json 处理器
class CNodeDataCofing : public JsonHandler<NodeData_Config>
{
public:
    /*
        NodeData_Config --> JSON_string
     */
    std::string serialize(const NodeData_Config &data, vector<std::string> &param) override;
    /*
        JSON_File --> NodeData_Config
        JSON_File --> JSON_string
     */
    bool read(const std::string &filename, NodeData_Config &data, string &json_string) override;
    /*
        NodeData_Config --> JSON_File
     */
    bool write(const std::string &filename, const NodeData_Config &data) override;

private:

    NodeData_Config m_config;

    // 解析单个属性项（EquipProperty）
    void _parse_property(const rapidjson::Value& json_prop, EquipProperty& prop);
    //生成单个属性项到JSON
    void _generate_property(const EquipProperty& prop, rapidjson::Value& json_prop, rapidjson::Document::AllocatorType& alloc);

};


// ErrorConfig 处理器
class CFaultConfig : public JsonHandler<FaultConfig>
{
public:
    /*
        NodeData --> JSON_string
     */
    std::string serialize(const FaultConfig &data, vector<std::string> &param) override;
    /*
        JSON_File --> NodeData
        JSON_File --> JSON_string
     */
    bool read(const std::string &filename, FaultConfig &data, string &json_string) override;
    /*
        NodeData --> JSON_File
     */
    bool write(const std::string &filename, const FaultConfig &data) override;

private:

};

};     // namespace equip_system
#endif // JSON_HANDLER_H
